#ifndef VM_H
#define VM_H

#include <stdint.h>
#include "riscv.h"

/* 外部接口 */
pagetable_t create_pagetable(void);
void destroy_pagetable(pagetable_t pt);
int map_page(pagetable_t pt, uint64_t va, uint64_t pa, int perm);//创建一个新的页表（根页表）
int map_region(pagetable_t pt, uint64_t va, uint64_t pa, uint64_t size, int perm);//销毁一个页表（释放所有关联的页表页）

/* 内部：walk */
pte_t* walk_lookup(pagetable_t pt, uint64_t va);//查找虚拟地址对应的PTE（不创建下级页表）
pte_t* walk_create(pagetable_t pt, uint64_t va);// 查找并创建虚拟地址对应的PTE（自动创建缺失的下级页表）

/* 内核页表与启用 */
void kvminit(void);//初始化内核页表（仅在启动核上执行一次）
void kvminithart(void);//在每个CPU核心上启用内核页表

/* 调试 */
void dump_pagetable(pagetable_t pt, int level, uint64_t va_base);//打印页表内容

#endif